import Animal, { AnimalConfig } from "./Animal.js";

/**
 * 生成大小在ab之间的随机数。谁大谁小无所谓。
 * @param a 
 * @param b 
 * @returns 
 */
export function random(a:number,b=0){
    let min,max;
    if(a>b){
        max=a;
        min=b;
    }else{
        max=b;
        min=a;
    }
    let r=Math.random();
    r=r*(max-min)+min;
    return parseInt(r.toFixed(0));
}

export function bindValue(obj:any,key:string,element:HTMLElement){
    Object.defineProperty(obj,key,{
        set:(v)=>{
            element.innerText=v
            obj[key]=v;
        }
    })
}

/**
 * 键值对列表
 */
const animalsKVMap:{[k: string]: keyof Animal}={
    a:"id",
    b:"power",
    c:"wantEat",
    d:"wantbreed",
    e:"wantsun",
    f:"wantmove",
    x:"x",
    y:"y",
}
// 记一下。说起来我可以设计一个开源库，来压缩JSON诶
/**
 * 压缩动物列表，以让其可以在localStorage存储更多
 * @param arr 
 * @returns 
 */
export function zipAnimalList(arr:Animal[]){
    // 第一次压缩——把键全换成单字符,把十进制度转更大的进制
    let newArr=arr.map(v=>{
        let newKs=Object.keys(animalsKVMap);
        let zipAnimal:any={}
        newKs.forEach((newK)=>{
            let oldK=animalsKVMap[newK];
            zipAnimal[newK]=v[oldK].toString(36);
        })
        return zipAnimal
    })
    let arrStr=JSON.stringify(newArr);
    // 第三次压缩,把大括号引号去掉
    arrStr=arrStr.replaceAll("},{",";").replaceAll("\"","").replace("[{","").replace("}]","");
    return arrStr
}

export function unzipAnimalList(str:string){
    str=`[{"${str.replaceAll(",","\",\"").replaceAll(";","\"},{\"").replaceAll(":","\":\"")}"}]`;
    console.log(str);
    let obj:[]=JSON.parse(str);
    return obj.map(e=>{
        let keys=Object.keys(e);
        let animal:any={};
        keys.forEach(k=>{
            let ak=animalsKVMap[k];
            animal[ak]=parseInt(e[k],36);
        })
        return new Animal(animal);
    })
}